package middleware

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
)

// NoCache 是一个中间件函数，它会添加头部信息
// 以防止客户端缓存HTTP响应。
func NoCache(c *gin.Context) {
    c.Header("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate, value")
    c.Header("Expires", "Thu, 01 Jan 1970 00:00:00 GMT") // 设置过期时间为1970年，即告诉浏览器立即过期
    c.Header("Last-Modified", time.Now().UTC().Format(http.TimeFormat)) // 设置最后修改时间为当前时间
    c.Next() // 继续处理后续中间件
}

// Options 是一个中间件函数，它会添加头部信息
// 用于处理OPTIONS请求，并且终止中间件链并结束请求。
func Options(c *gin.Context) {
    if c.Request.Method != "OPTIONS" {
        c.Next() // 如果不是OPTIONS请求，继续处理后续中间件
    } else {
        c.Header("Access-Control-Allow-Origin", "*") // 允许任何源
        c.Header("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS") // 允许的方法
        c.Header("Access-Control-Allow-Headers", "authorization, origin, content-type, accept") // 允许的头部
        c.Header("Allow", "HEAD,GET,POST,PUT,PATCH,DELETE,OPTIONS") // 允许的请求类型
        c.Header("Content-Type", "application/json") // 设置内容类型为JSON
        c.AbortWithStatus(200) // 终止请求并返回200状态码
    }
}

// Secure 是一个中间件函数，它会添加安全性和资源访问相关的头部。
func Secure(c *gin.Context) {
    c.Header("Access-Control-Allow-Origin", "*") // 允许任何源
    c.Header("X-Frame-Options", "DENY") // 防止被iframe嵌套，防止点击劫持
    c.Header("X-Content-Type-Options", "nosniff") // 禁止浏览器从响应中嗅探MIME类型
    c.Header("X-XSS-Protection", "1; mode=block") // 启用XSS保护并设置模式为block
    if c.Request.TLS != nil {
        c.Header("Strict-Transport-Security", "max-age=31536000") // 启用严格传输安全，max-age一年
    }

    // 也可以考虑添加内容安全策略头部
    // c.Header("Content-Security-Policy", "script-src 'self' https://cdnjs.cloudflare.com")
}